package com.sy.simpleegg.ui.dialog

import android.annotation.SuppressLint
import android.content.Context
import android.content.DialogInterface
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.GridLayoutManager
import com.bumptech.glide.Glide
import com.sy.simpleegg.R
import com.sy.simpleegg.adapter.WriteOffChannelAdapter
import com.sy.simpleegg.bean.CouponInfoBean
import com.sy.simpleegg.databinding.DialogMultCouponBinding
import com.sy.simpleegg.ext.countDown
import com.sy.simpleegg.ext.logFile
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel


class MultCouponDialog(
    private val title: String?,
    private val tips: String?,
    private val tid: String,
    private val couponTypeList: MutableList<CouponInfoBean>,
    private val countDownTime: Int,
    private var multCouponDialogListener: MultCouponDialogListener,
): DialogFragment() {

    private lateinit var binding: DialogMultCouponBinding

    var timeDownScope: CoroutineScope? = null

    private var writeOffChannel = ""
    private var writeOffType = -1

    override fun onStart() {
        super.onStart()
//        dialog!!.window!!.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)

        val width = resources.getDimensionPixelSize(R.dimen.dialog_paytype_width)
        val height = resources.getDimensionPixelSize(R.dimen.dialog_write_off_height)
//        val marginBottom = resources.getDimensionPixelSize(R.dimen.dialog_good_detail_margin_bottom)

//        dialog!!.window!!.setLayout(width, height + marginBottom)
        dialog!!.window!!.setLayout(width, height)
        dialog!!.window!!.setGravity(Gravity.CENTER)
        dialog!!.setCanceledOnTouchOutside(false)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View? {
        binding = DialogMultCouponBinding.inflate(inflater, container, false)
//        setStyle(STYLE_NO_TITLE, R.style.MyDialog)
//        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT))
//        dialog!!.window!!.setGravity(Gravity.BOTTOM)
        dialog!!.window!!.setBackgroundDrawableResource(R.color.transparent)
//        var wlp = dialog!!.window!!.attributes
//        wlp.gravity = Gravity.BOTTOM
//        wlp.width = WindowManager.LayoutParams.MATCH_PARENT
//        wlp.height = WindowManager.LayoutParams.MATCH_PARENT
//        dialog!!.window!!.attributes = wlp

        return binding.root
    }

    @SuppressLint("SetTextI18n")
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        try {
            binding.layoutClose.tvDismiss.text = "${countDownTime}S"

            binding.layoutClose.tvClose.setOnClickListener {
                multCouponDialogListener.back()
                dismissAllowingStateLoss()
            }
            binding.btnDismiss.setOnClickListener {
                multCouponDialogListener.back()
                dismissAllowingStateLoss()
            }

            binding.rvPayType.layoutManager = GridLayoutManager(requireContext(), 3)
            binding.rvPayType.adapter = WriteOffChannelAdapter(requireContext(), couponTypeList).apply { setOnItemClickListener(object : WriteOffChannelAdapter.OnItemClickListener{
                override fun onClick(couponInfoBean: CouponInfoBean) {
                    writeOffChannel = couponInfoBean.channel
                    writeOffType = couponInfoBean.type
                    resetCountDown()
                }
            }) }

            homePage()
        }catch (e: Exception){
            e.printStackTrace()
            logFile("初始化页面异常：${e.message}")
        }
    }

    override fun showNow(manager: FragmentManager, tag: String?) {
        super.showNow(manager, tag)
        startCountDown(countDownTime)
    }

    override fun show(manager: FragmentManager, tag: String?) {
        super.show(manager, tag)
        startCountDown(countDownTime)
    }

    override fun show(transaction: FragmentTransaction, tag: String?): Int {
        val result = super.show(transaction, tag)
        startCountDown(countDownTime)
        return result

    }

    override fun onDismiss(dialog: DialogInterface) {
        super.onDismiss(dialog)
        multCouponDialogListener.dismiss(tid)
    }

    @SuppressLint("SetTextI18n")
    private fun startCountDown(timeout: Int){
//        var timeDownScope: CoroutineScope? = null
        timeDownScope?.cancel()

        countDown(
            time = countDownTime,
            start = {
                timeDownScope = it
                logFile("开始倒计时")
            },
            end = {
                logFile("结束倒计时")
            },
            next = {
                binding.layoutClose.tvDismiss.text = "${it}S"
                if (it == 0){
                    dismissAllowingStateLoss()
                }
            })
    }

    /**
     * 支付状态
     * @param status 0-收到团购码核销中 1-核销完成 2-支付异常
     */
    fun setPayStatus(status: Int, msg: String? = null){
        when (status){
            0 -> {
                payingPage()
                resetCountDown()
            }
            1 -> {
                paySuccessedPage()
            }
            2 -> {
                payFailedPage(msg)
                startCountDown(5)
            }
        }
    }

    /**
     * 默认页面
     */
    private fun homePage(){
        binding.tvTitle.text = title
        binding.tvTips.text = tips
        loadWriteOffStatusPic(R.mipmap.ic_package_backscan)
        couponTypeList.forEach { couponInfoBean ->
            if (couponInfoBean.isSelected){
                writeOffChannel = couponInfoBean.channel
                writeOffType = couponInfoBean.type
            }
        }
    }

    /**
     * 支付中
     */
    private fun payingPage(){
        binding.tvTips.text = getString(R.string.write_off_ing)
        loadWriteOffStatusPic(R.mipmap.ic_paying)
    }

    /**
     * 支付成功
     */
    private fun paySuccessedPage(){
        binding.tvTips.text = getString(R.string.write_off_success)
        loadWriteOffStatusPic(R.mipmap.ic_pay_successed)
    }

    /**
     * 支付异常
     */
    @SuppressLint("SetTextI18n")
    private fun payFailedPage(msg: String?){
        binding.tvTips.text = "${getString(R.string.write_off_failed)}${msg?.let { ":$it" }?:""}"
        loadWriteOffStatusPic(R.mipmap.ic_pay_failed)
    }

    private fun loadWriteOffStatusPic(resId: Int){
        Glide.with(requireContext())
            .load(resId)
            .fitCenter()
            .into(binding.ivStatus)
    }

    fun getChannel(): String{
        resetCountDown()
        return writeOffChannel
    }

    fun getType(): Int{
        resetCountDown()
        return writeOffType
    }

    private fun resetCountDown(){
        startCountDown(countDownTime)
    }

    interface MultCouponDialogListener{
        fun dismiss(transId: String)

        fun back()

//        fun selectPayType(payTypeData: PayTypeDataYch, goodBean: GoodBean)
    }

    fun dpToPx(context: Context, dp: Int): Int {
        val density = context.resources.displayMetrics.density
        return Math.round(dp * density)
    }
}